#include "BitWrapper.h"

BitWrapper::BitWrapper(){
    this -> bufferLectura = 0;
    this -> posicionBufferLectura = 0;
    this->bufferEscritura=0;
    this->contadorBufferEscritura=0;
}

void BitWrapper::writeBit(const unsigned int bit,Archivo *a){

    //Si paso un 1 lo meto en el buffer, sino solo muevo el contador.
    if (bit){
        //Coloco en buffer
        unsigned int auxiliar = 1;
        auxiliar=(auxiliar<<(1 + this -> contadorBufferEscritura-1));
        this -> bufferEscritura = bufferEscritura | auxiliar;
        this -> contadorBufferEscritura++;
    }else{
        this->contadorBufferEscritura++;
    }
    //Si el buffer se lleno guardo en archivo
    if(this->contadorBufferEscritura == 8){
        a->write((char*) &this->bufferEscritura, sizeof(unsigned char));
        this -> contadorBufferEscritura = 0;
        this -> bufferEscritura = 0;
    }
    this -> numeroDeBit += 1;
}

unsigned int BitWrapper::getBit(Archivo* a){

    int retorno = 0;
    if(posicionBufferLectura == 0) {
        if(!a->eof())
            a->read( (char*) &this->bufferLectura,sizeof(uint64_t));
        this -> posicionBufferLectura = sizeof(uint64_t)*8;
    }
    retorno = 1 & (this->bufferLectura>>(sizeof(uint64_t)*8-this->posicionBufferLectura));
    this->posicionBufferLectura--;
    return retorno;
}

void BitWrapper::rellenarBuffer(Archivo *a){
    unsigned int auxiliar=(1 + 8 - this -> contadorBufferEscritura-1);
    for(;auxiliar > 0;auxiliar--)
            writeBit(0,a);
}





